#include "manageprocess.h"


ManageProcess::ManageProcess(QObject *parent) :
    QObject(parent)
{
    init();
}

/*******************************************
  功能：初始化函数，初始化一些必要的参数
  参数：
  返回值：
  ******************************************/
void ManageProcess::init()
{
    //将它们的父进程设为0，这样有父进程自己关闭之后还可以存在
    displayProcess = new QProcess(0);
    updateSerProcess = new QProcess(0);

    connect(&closeTimer, SIGNAL(timeout()), this, SLOT(closeParent()));

    displayCtlTimer = new QTimer(this);
    connect(displayCtlTimer, SIGNAL(timeout()), this, SLOT(freDogTimeOut()));

    rebootTimer = new QTimer(this);
    connect(rebootTimer, SIGNAL(timeout()), this, SLOT(rebootSlot()));
    rebootTimer->setSingleShot(true);

    freDogTimeSize = 4 * 1000;
}

/*******************************************
  功能：打开显示控制程序
  参数：pgm，显示控制程序完全路径;arguments,参数列表;
       mode,打开方式
  返回值：
  ******************************************/
void ManageProcess::startDisCtl(const QString &pgm, const QStringList &arguments,
                                 QIODevice::OpenModeFlag mode)
{
    displayPgm = pgm;
    disCtlArgumentlist = arguments;
    openMode = mode;

    displayProcess->start(displayPgm, arguments, mode);
    displayCtlTimer->start(freDogTimeSize);
}

/*******************************************
  功能：设置显示控制程序的一些必要参数
  参数：pgm，路径;arguments,参数
  返回值：
  ******************************************/
void ManageProcess::setDisCtl(const QString &pgm, const QStringList &arguments)
{
    displayPgm = pgm;
    disCtlArgumentlist = arguments;

    displayCtlTimer->start(freDogTimeSize);

}

/*******************************************
  功能：设置喂狗时间间隔
  参数：time，时间间隔
  返回值：
  ******************************************/
void ManageProcess::setfreDogTimeSize(int timeSize)
{
    freDogTimeSize = timeSize;
}

/*******************************************
  功能：重新
  参数：
  返回值：
  ******************************************/
void ManageProcess::reSetTime()
{
    displayCtlTimer->stop();
    displayCtlTimer->start(freDogTimeSize);
}

/*******************************************
  功能：杀掉显示控制程序
  参数：
  返回值：
  ******************************************/
void ManageProcess::killDisCtlProcess()
{
    displayProcess->kill();
}

/*******************************************
  功能：重启显示控制程序
  参数：
  返回值：
  ******************************************/
void ManageProcess::rebootDidCtl()
{
    if (displayProcess->state() != QProcess::NotRunning)
        return;
    if (displayProcess->state() == QProcess::NotRunning)
    {
        rebootTimer->start(1000);
    }
}

/*******************************************
  功能：更新服务器
  参数：auxiliaryPath，辅助程序路径;serviceFileInfo,服务器文件信息
  返回值：
  ******************************************/
bool ManageProcess::updateService(const QString &programPath, const QString &updatePath,
                                  const QString &backupPath)
{
    //检查要更新服务器文件是否正确，通过大小来检查
//    QFile file(updatePath + "/" + PROGRAMNAME);
//    if (!file.exists())
//    {
//        return false;
//    }

    //设置要传给重新启动的服务器的参数

    QStringList arguments;
    arguments.clear();
    arguments << programPath << updatePath << backupPath;

//    qDebug() << "arguments:" << arguments;

    auxiliaryPgm = g_installPath + AUXPATH;
    auxiliaryArg.clear();
    auxiliaryArg = arguments;
    return true;
}

/*******************************************
  功能：关闭父进程
  参数：parentWidget,父进程
  返回值：
  ******************************************/
void ManageProcess::closeParentWidget(QWidget *parentWidget)
{
    auxiliaryPgm = g_installPath + AUXPATH;

    updateSerProcess->start(auxiliaryPgm, auxiliaryArg);
//    auxiliaryArg.clear();
//    updateSerProcess->start(auxiliaryPgm, auxiliaryArg);

    connect(updateSerProcess, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(startUpdate(QProcess::ProcessState)));

    mParentWidget = parentWidget;

    //在windows中，Qprocess反应速度比较快，如果没及时关闭，将导致服务器未关闭
#if defined  Q_OS_WIN32  //for linux
    closeParent();
#endif

}

/*******************************************
  功能：喂狗槽函数，喂狗时间结束，还没有收到喂狗数据，此时将重新显示控制器
  参数：
  返回值：
  ******************************************/
void ManageProcess::freDogTimeOut()
{
    this->rebootDidCtl();
}

/*******************************************
  功能：重新显示控制器槽函数
  参数：
  返回值：
  ******************************************/
void ManageProcess::rebootSlot()
{
    displayProcess->start(displayPgm, disCtlArgumentlist, openMode);
    displayCtlTimer->start(freDogTimeSize);

    emit processReboot();

}

/*******************************************
  功能：开始更新服务器
  参数：
  返回值：
  ******************************************/
void ManageProcess::startUpdate(QProcess::ProcessState state)
{
    //在linux中QProcess的反应速度比较慢，所以必须定时一段时间后再关闭，不然会导致
    //更新辅助进程未启动即把所有东西都关闭
    if (state == QProcess::Running)
    {
        closeTimer.start(10);
    }
}

/*******************************************
  功能：关闭父进程
  参数：
  返回值：
  ******************************************/
void ManageProcess::closeParent()
{
    mParentWidget->close();
    qApp->exit(222);

}

